package org.example.day01;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * 给定一个字符串s，最多只能进行一次变换，返回变换后能得到的最小字符串（按照字典序进行比较）。
 * 变换规则：交换字符串中任意两个不同位置的字符
 * @date 2024/3/11 15:22
 */
public class test014 {
    public static void main(String[] args) {
        String result = rearrangeString("abcdef");
        System.out.println(result);
    }

    private static String rearrangeString(String s) {
        char[] arr = s.toCharArray(); // 将输入字符串转换为字符数组
        int t = -1; // 初始化交换计数器

        for (int i = 0; i < arr.length - 1; i++) {
            char tmp2 = getMinCharacter(arr, i + 1); // 找到当前元素后面的最小字符

            if (arr[i] > tmp2) { // 如果当前元素大于最小字符，则需要进行交换
                int index = getIndex(arr, tmp2, i + 1); // 获取最小字符的索引
                swap(arr, i, index); // 交换当前元素和最小字符
                t += 1; // 交换计数器加一
                break; // 找到第一个需要交换的位置后，结束循环
            }
        }

        if (t == -1) { // 如果没有发生交换
            return s; // 返回原始字符串
        }

        return new String(arr); // 将字符数组转换为字符串并返回
    }

    private static char getMinCharacter(char[] arr, int start) {
        char minChar = arr[start];
        for (int i = start + 1; i < arr.length; i++) {
            if (arr[i] < minChar) {
                minChar = arr[i];
            }
        }
        return minChar;
    }

    private static int getIndex(char[] arr, char target, int start) {
        for (int i = start; i < arr.length; i++) {
            if (arr[i] == target) {
                return i;
            }
        }
        return -1;
    }

    private static void swap(char[] arr, int i, int j) {
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

